首页 > 试题广场 >

最长无重复子数组

[编程题]最长无重复子数组
  • 热度指数:329303 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个长度为n的数组arr,返回arr的最长无重复元素子数组的长度,无重复指的是所有数字都不相同。
子数组是连续的,比如[1,3,5,7,9]的子数组有[1,3],[3,5,7]等等,但是[1,3,7]不是子数组

数据范围:
示例1

输入

[2,3,4,5]

输出

4

说明

[2,3,4,5]是最长子数组        
示例2

输入

[2,2,3,4,3]

输出

3

说明

[2,3,4]是最长子数组        
示例3

输入

[9]

输出

1
示例4

输入

[1,2,3,1,2,3,2,2]

输出

3

说明

最长子数组为[1,2,3]       
示例5

输入

[2,2,3,4,8,99,3]

输出

5

说明

最长子数组为[2,3,4,8,99]     
class Solution:
    def maxLength(self, arr: List[int]) -> int:
        if len(arr) <= 1:
            return len(arr)

        left, right = 0, 1
        index = {arr[left]}
        max_arr = 0

        while right < len(arr):
            if arr[right] not in index:
                index.add(arr[right])
                right += 1
                max_arr = max(max_arr, right - left)
            else:
                index.remove(arr[left])
                left += 1

        return max_arr
发表于 2024-02-28 21:03:34 回复(0)
class Solution:
    def maxLength(self , arr: List[int]) -> int:
        # write code here
        maxValue = 0
        map = {}
        # 窗口左侧
        left = 0
        # 窗口右侧
        for right in range(len(arr)):
            if arr[right] in map.keys():
                # 记录数组在map中出现的次数
                map[arr[right]] += 1
            else:
                map[arr[right]] = 1
            # 遇到重复出现的字符,需要滑动窗口左侧,直到该字符只出现一次 
            while map[arr[right]] > 1:
                # 前面的字符可以删掉或者为0
                map[arr[left]] -= 1
                left += 1
            maxValue = max(maxValue, right - left +1)
        return maxValue

发表于 2023-08-18 14:54:21 回复(0)
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param arr int整型一维数组 the array
# @return int整型
#
class Solution:
    def maxLength(self , arr: List[int]) -> int:
        tmp = {}
        ret = 0
        start = -1
        for i in range(len(arr)):
            if arr[i] in tmp.keys() and tmp.get(arr[i]) > start:
                start = tmp.get(arr[i])
            tmp[arr[i]] = i
            if i - start > ret:
                ret = i - start
        return ret

发表于 2022-09-26 22:11:48 回复(0)
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param arr int整型一维数组 the array
# @return int整型
#
class Solution:
    def maxLength(self , arr: List[int]) -> int:
        # write code here
        n=len(arr)
        if n<=1:
            return n 
        q=[]
        res=0
        for i in range(n):
            while arr[i] in q:
            #注意这里是while,不是if,可能在q中存在多个qrr[i]
                q.pop(0)
            q.append(arr[i])
            res=max(res,len(q))
        return res

发表于 2022-08-22 19:07:10 回复(0)
class Solution:
    def maxLength(self , arr ):
        # write code here
        n = len(arr)
        ans = []
        dic = set()
        r = 0
        for i in range(n):
            while r < n and arr[r] not in dic:
                dic.add(arr[r])
                r += 1
            if len(dic) > len(ans):
                ans = list(dic)
            if r == n-1:
                return len(ans)
            dic.remove(arr[i])
        return len(ans)

发表于 2022-08-07 23:33:38 回复(0)
用例输入
[1,2,3,4,1,5,6,7,8,1]
预期输出
8
实际输出 5


这个测试用例没毛病吗

发表于 2022-07-18 18:13:06 回复(0)
class Solution:
    def maxLength(self , arr: List[int]) -> int:
        # write code here
        mapping = {}  # 存放访问过的元素的索引
        i = 0  # 头指针
        j = 0  # 尾指针
        res = 0  # 记录结果
        while i < len(arr):
            # 若该元素已在字典中,且其索引在尾指针之后,表明子数组出现重复元素
            # 更新尾指针的位置为重复元素索引的后一位,同时更新重复元素的索引为头指针
            if arr[i] in mapping.keys() and mapping[arr[i]] >= j:  
                j = mapping[arr[i]] + 1
                mapping[arr[i]] = i
            # 若元素不在字典中,或者元素的索引在头指针之前,只需要添加/更新元素索引
            else:
                mapping[arr[i]] = i
            res = max(res, i-j+1)
            i += 1
        return res

发表于 2022-06-15 22:23:53 回复(0)

哈希表 + 双指针构成滑动窗口
时间复杂度:O(n) 时间复杂度:O(n)

class Solution:
    def maxLength(self , arr: List[int]) -> int:
        mp = {}
        res = 0
        left = 0
        for right in range(len(arr)):
            if arr[right] in mp:
                mp[arr[right]] += 1
            else:
                mp[arr[right]] = 1
            while mp[arr[right]] > 1:
                mp[arr[left]] -= 1
                left += 1
            res = max(res, right - left + 1)
        return res
发表于 2022-05-27 11:37:40 回复(0)
class Solution:
    def maxLength(self , arr: List[int]) -> int:
        # write code here
        left = 0
        right = 0
        maxl = 0
        a = {}
        for i in range(len(arr)):
            right = i
            if len(a) != 0:
                if arr[i] in a:
                    if left <= a[arr[i]]:
                        left = a[arr[i]] + 1
            if (right - left) >= maxl:
                maxl = right - left + 1
            a[arr[i]] = i
        return maxl
发表于 2022-01-07 11:28:17 回复(0)
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param arr int整型一维数组 the array
# @return int整型
#
class Solution:
    def maxLength(self , arr: List[int]) -> int:
        # write code here
        pre_dis = 0
        maxl = 0
        dis = {}
        for i in range(len(arr)):
            num = arr[i]
            if num in dis:
                pre_dis = max(pre_dis,dis[num])
            maxl = max(maxl,i+1-pre_dis)
            dis[num]=i+1
        return maxl
                
                
                
                

发表于 2021-12-14 22:01:50 回复(0)
方法一:
# 个人觉得和别人思路有些不同,便将其讨论
class Solution:
    def maxLength(self , arr: List[int]) -> int:
        # write code here
        a=[]
        maxl=0
        for num in arr:
            if num in a and len(a)!=0:
                # 若num在其中将不断pop(使用a[1:]替换pop)
                while num in a:
                    a=a[1:]
            a.append(num)
            maxl=max(maxl,len(a))
        return maxl
    
方法二:

class Solution:
    def maxLength(self , arr ):
        pre_dis = 0
        maxl = 0
        dis = {}
        for i in range(len(arr)):
            num = arr[i]
            if num in dis:
                pre_dis = max(pre_dis,dis[num]) # 寻找最大左指针,意思遇到该值就会在该索引值右移动一位
            maxl = max(maxl,i+1-pre_dis) 
            dis[num]=i+1  # 保存列表值得索引,若有重复将会覆盖
        return maxl


发表于 2021-11-27 22:57:35 回复(0)
# 使用start记录最长无重复子串的起始index
# 要在该element已经存在在hash_arr且对应的index在start之后
# 更新start既可
# 该解法应该比较elegant
class Solution:
    def maxLength(self , arr: List[int]) -> int:
        hash_arr = dict()
        max_len = 0
        s=0
        for i in range(len(arr)):
            if arr[i] in hash_arr and hash_arr[arr[i]] >= s:
                    s = hash_arr[arr[i]] + 1
            hash_arr[arr[i]] = i
            max_len = max(max_len, i - s + 1 )
        return max_len
发表于 2021-11-18 21:45:11 回复(0)
import collections
class Solution:
    def maxLength(self , arr: List[int]) -> int:
        # write code here
        c = collections.defaultdict(int)
        l = 0 
        res = 0
        for i in range(len(arr)):
            c[arr[i]] += 1
            while len(c) != i - l + 1:
                c[arr[l]] -= 1
                if c[arr[l]] == 0:
                    c.pop(arr[l])
                l += 1
            res = max(res,i - l  + 1)
        return res



滑动窗口模版题
发表于 2021-11-05 19:06:04 回复(0)